package com.cykj.order.util;

import com.cykj.order.domain.BsRegion;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @BelongsProject: jx2503-waimaixia
 * @BelongsPackage: com.cykj.order.util
 * @Author: 泽日
 * @CreateTime: 2025-08-20 17:26
 * @Description: TODO
 * @Version: 1.0
 */

public class TreeUtil {
    /**
     * 构建树形结构
     */
    public static List<BsRegion> buildTree(List<BsRegion> regions) {
        Map<Integer, BsRegion> map = new HashMap<>();
        for (BsRegion region : regions) {
            // 确保 children 不为空
            if (region.getChildren() == null) {
                region.setChildren(new ArrayList<>());
            }
            map.put(region.getId(), region);
        }

        List<BsRegion> roots = new ArrayList<>();
        for (BsRegion region : regions) {
            if (region.getParentId() == null) {
                // 顶级节点
                roots.add(region);
            } else {
                // 挂到父节点
                BsRegion parent = map.get(region.getParentId());
                if (parent != null) {
                    parent.getChildren().add(region);
                }
            }
        }
        return roots;
    }

    /**
     * 获取完整路径（省市区全称）
     */
    public static String getFullRegionName(Long targetId, List<BsRegion> tree) {
        if (targetId == null) {
            return null;
        }
        for (BsRegion node : tree) {
            String path = findPath(node, targetId, "");
            if (path != null) {
                return path;
            }
        }
        return null;
    }

    /**
     * 重载方法：支持Integer类型的targetId
     */
    public static String getFullRegionName(Integer targetId, List<BsRegion> tree) {
        if (targetId == null) {
            return null;
        }
        return getFullRegionName(targetId.longValue(), tree);
    }

    /**
     * 递归查找路径
     */
    private static String findPath(BsRegion node, Long targetId, String prefix) {
        // 添加分隔符，构建完整路径
        String newPrefix = prefix.isEmpty() ? node.getRegionName() : prefix + "-" + node.getRegionName();

        // 修复数据类型不匹配问题：将Integer转换为Long进行比较
        if (node.getId() != null && node.getId().longValue() == targetId.longValue()) {
            return newPrefix;
        }
        
        // 遍历子节点
        if (node.getChildren() != null) {
            for (BsRegion child : node.getChildren()) {
                String path = findPath(child, targetId, newPrefix);
                if (path != null) {
                    return path;
                }
            }
        }
        return null;
    }
}
